package com.dte.dao;

/*
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
*/
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import utiles.AppProperties;
import utiles.utilitarios;


import com.ctb.vo.DocumentoReferenciaVO;
import com.dte.dto.GuiaDespRptaDTE;
import com.dte.vo.DetalleVO;
import com.dte.vo.EmisorVO;
import com.dte.vo.EncabezadoVO;
import com.dte.vo.ObservacionVO;
import com.dte.vo.ReceptorVO;
import com.dte.vo.TotalesVO;
import com.dte.vo.TransporteVO;
import com.liquid_technologies.ltxmllib8.exceptions.LtException;




public class GuiaDespachoDAO {
	private static String dteAmbiente = (AppProperties.getProperty("aplicacion", "DTE_AMBIENTE_DTBOX"));
	private static String dteFechaRes = (AppProperties.getProperty("aplicacion", "DTE_FECHA_RESOLUCION"));
	private static String dteNumRes = (AppProperties.getProperty("aplicacion", "DTE_NUM_RESOLUCION"));
	/*
	 * dteAmbiente
	 * dteFechaRes
	 * dteNumRes
	DTE_AMBIENTE_DTBOX = HOMOLOGACION
			DTE_FECHA_RESOLUCION = 2014-05-08
			DTE_NUM_RESOLUCION = 0
			*/ 
	String horaActual = utilitarios.getFechaHoraActual();
			
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GuiaDespachoDAO envia = new GuiaDespachoDAO();
		try {
			//envia.enviaGuia();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("error :"+e.getMessage());
		}

	}

	public void enviaGuia() throws Exception{		
        //DTE
        DocumentoDTE.SiiDte.DTEDefType dte = new DocumentoDTE.SiiDte.DTEDefType();
        dte.setDTE_Choice(new DocumentoDTE.SiiDte.DTE_Choice());

        //Documento
        dte.getDTE_Choice().setDocumento(new DocumentoDTE.SiiDte.Documento());
        DocumentoDTE.SiiDte.Documento doc = dte.getDTE_Choice().getDocumento();
        
        //Documento/Encabezado
        doc.setEncabezado(new DocumentoDTE.SiiDte.Encabezado());

        //Documento/Encabezado/IdDoc
        DocumentoDTE.SiiDte.IdDoc idDoc = new DocumentoDTE.SiiDte.IdDoc();
        idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n52);
        idDoc.setFolio(BigInteger.valueOf(5));
        idDoc.setFchEmis(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, "2014-05-23"));
        idDoc.setFmaPago(DocumentoDTE.SiiDte.IdDoc_FmaPago.n1);
        idDoc.setFchVenc(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, "2014-05-23"));
        idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n1);
        idDoc.setTipoDespacho(DocumentoDTE.SiiDte.IdDoc_TipoDespacho.n1);
        doc.getEncabezado().setIdDoc(idDoc);
        
        //Documento/Encabezado/Emisor
        DocumentoDTE.SiiDte.Emisor emisor = new DocumentoDTE.SiiDte.Emisor();
        emisor.setRUTEmisor("70335000-3");
        emisor.setRznSoc("Liga Chilena Contra la Epilepsia");
        emisor.setGiroEmis("INSTITUCION DE BENEFICIENCIA- VENTA DE MEDICAMENTOS");
        emisor.getActeco().add(BigInteger.valueOf(521900));
        emisor.getTelefono().add("123-1234-12345");
        emisor.setDirOrigen("PATRIOTAS URUGUAYOS 2236");
        emisor.setCmnaOrigen("Santiago");
        emisor.setCiudadOrigen("Santiago");
        doc.getEncabezado().setEmisor(emisor);
        
        //Documento/Encabezado/Receptor
        DocumentoDTE.SiiDte.Receptor receptor = new DocumentoDTE.SiiDte.Receptor();
        receptor.setRUTRecep("76833240-1");
        receptor.setRznSocRecep("ebsys factory");
        receptor.setGiroRecep("Desarrollo");
        receptor.setContacto("Contacto");
        receptor.setCorreoRecep("ebarrios@ebsys.cl");
        receptor.setDirRecep("Salar Surire 1274");
        receptor.setCmnaRecep("Pudahuel");
        receptor.setCiudadRecep("Santiago");
        receptor.setCmnaPostal("Santiago");
        doc.getEncabezado().setReceptor(receptor);
        
        //Documento/Encabezado/Transporte
        // Es opcional, en caso que el despacho vaya a otra direcci�n distinta al receptor
        DocumentoDTE.SiiDte.Transporte transporte = new DocumentoDTE.SiiDte.Transporte();
        transporte.setDirDest("Alameda 580 Oficina 601");
        transporte.setCmnaDest("Santiago");
        transporte.setCiudadDest("Santiago");
        doc.getEncabezado().setTransporte(transporte);
        
        //Documento/Encabezado/Totales
        DocumentoDTE.SiiDte.Totales totales = new DocumentoDTE.SiiDte.Totales();
        totales.setMntNeto(BigInteger.valueOf(2000));
        totales.setTasaIVA(BigDecimal.valueOf(19));
        totales.setIVA(BigInteger.valueOf(380));
        totales.setMntTotal(BigInteger.valueOf(2380));
        doc.getEncabezado().setTotales(totales);
        
       //Documento/Detalle
        DocumentoDTE.SiiDte.Detalle det = new DocumentoDTE.SiiDte.Detalle();
        det.setNroLinDet(BigInteger.valueOf(1));
        det.setNmbItem("Item de Ejemplo");
        det.setMontoItem(BigInteger.valueOf(1000));
        det.setQtyItem(BigDecimal.valueOf(1));
        det.setPrcItem(BigDecimal.valueOf(1000));
        
        //Documento/Detalle/CdgItem
        DocumentoDTE.SiiDte.CdgItem cdgItem = new DocumentoDTE.SiiDte.CdgItem();
        cdgItem.setTpoCodigo("INT");
        cdgItem.setVlrCodigo("001");
        det.getCdgItem().add(cdgItem);

        doc.getDetalle().add(det);     
        
        //Documento/Detalle 2
        det = new DocumentoDTE.SiiDte.Detalle();
        det.setNroLinDet(BigInteger.valueOf(2));
        det.setNmbItem("Item de Ejemplo 2");
        det.setMontoItem(BigInteger.valueOf(1000));
        det.setQtyItem(BigDecimal.valueOf(1));
        det.setPrcItem(BigDecimal.valueOf(1000));
        
        //Documento/Detalle/CdgItem
        cdgItem = new DocumentoDTE.SiiDte.CdgItem();
        cdgItem.setTpoCodigo("INT");
        cdgItem.setVlrCodigo("002");
        det.getCdgItem().add(cdgItem);

        doc.getDetalle().add(det);     
        
               
        //Personalizados
        DocumentoDTE.SiiDte.PersonalizadosA personalizados = new DocumentoDTE.SiiDte.PersonalizadosA();
        dte.setPersonalizados(personalizados);

        personalizados.setDocPersonalizado(new DocumentoDTE.SiiDte.DocPersonalizadoA());

        DocumentoDTE.SiiDte.CampoStringA campoString = new DocumentoDTE.SiiDte.CampoStringA();
        campoString.setName("Observaciones");
        campoString.setText("Estas son las observaciones");
        personalizados.getDocPersonalizado().getCampoString().add(campoString);
  
        
        // Llamada al servicio
        String ambiente = dteboxcliente.Ambiente.Homologacion;
        String fechaResolucion = "2014-05-08";
        int numeroResolucion = 0;
        int tipoPdf417 = dteboxcliente.TipoPDF417.Fuente;
        // Local la IP debe ser 10.10.10.10
    	String apiURL = "http://10.10.10.10/api/Core.svc/Core";
        //String apiURL = "http://25.120.85.185/api/Core.svc/Core";
        // DTEBox liche
        String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";
        // System.out.println("Creando el servicio");
        dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
        // System.out.println("Llamando el servicio");
          
        dteboxcliente.ResultadoEnvioDocumento resultado = servicio.EnviarDocumento(dte, ambiente, fechaResolucion, numeroResolucion, tipoPdf417);
        System.out.println("Llamado");
        System.out.println(dte.toXml());
        // Procesar resultado
        if (resultado.getResultadoServicio().getEstado() == 0){            
            System.out.println("ok");
            String ted = resultado.getTED();
            String pdf417 = resultado.getPDF417();            
            System.out.println("Folio: " + idDoc.getFolio().intValue());            
        }else{
            String error = resultado.getResultadoServicio().getDescripcion();
            System.out.println(error);
            System.out.println(resultado.getResultadoServicio().getExcepcionOriginal());
        }

	}
	
	public int enviaGuia(EncabezadoVO encabezadoVO,ReceptorVO receptorVO,	TransporteVO tranporteVO,
			              TotalesVO totalesVO, ObservacionVO observacionVO, EmisorVO emisorVO, 
			              List<DetalleVO> detalleList,  List <DocumentoReferenciaVO> detalleRefList) throws LtException{
		List<GuiaDespRptaDTE> listRetorno = new ArrayList<GuiaDespRptaDTE>();
		int control = 4;
		
		 //DTE
        DocumentoDTE.SiiDte.DTEDefType dte = new DocumentoDTE.SiiDte.DTEDefType();
        try {
			dte.setDTE_Choice(new DocumentoDTE.SiiDte.DTE_Choice());
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        
        //Documento
        try {
			dte.getDTE_Choice().setDocumento(new DocumentoDTE.SiiDte.Documento());
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        DocumentoDTE.SiiDte.Documento doc = dte.getDTE_Choice().getDocumento();
        
       
        
        //Documento/Encabezado
        try {
			doc.setEncabezado(new DocumentoDTE.SiiDte.Encabezado());
		} catch (LtException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


        //Documento/Encabezado/IdDoc
        DocumentoDTE.SiiDte.IdDoc idDoc = new DocumentoDTE.SiiDte.IdDoc();
        //System.out.println("inicio seteo tipoDoc");
        if (encabezadoVO.getTipoDoc().equals("FCI")){
            idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n33); //Factura
        }else if (encabezadoVO.getTipoDoc().equals("GDC")){    
            idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n52);// Guia de Depacho
        }else if (encabezadoVO.getTipoDoc().equals("FCE")){    
            idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n34);// Factura Exenta
        }else if (encabezadoVO.getTipoDoc().equals("NCC")){    
            idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n61);// Nota de Credito 
        }else if (encabezadoVO.getTipoDoc().equals("NDC")){    
            idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n56);// Nota de Debito 
        }else{
        	control=7;
        }
        //System.out.println("fin seteo tipoDoc");
        //idDoc.setTipoDTE(DocumentoDTE.SiiDte.DTEType.n52);
        if (control==4){
        	//System.out.println("Inicio seteo de envio a DTBox");
	        try {
				idDoc.setFolio(BigInteger.valueOf(Integer.parseInt(encabezadoVO.getFolio())));
				idDoc.setFchEmis(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, encabezadoVO.getFechaEmis()));
			    idDoc.setFmaPago(DocumentoDTE.SiiDte.IdDoc_FmaPago.n1);
			    idDoc.setFchVenc(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, encabezadoVO.getFechaEmis()));
			    if (encabezadoVO.getTipoDoc().equals("GDC")){
			    	if (encabezadoVO.getIdTipoTrans().equals("1"))
			    		idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n1);
			    	else if (encabezadoVO.getIdTipoTrans().equals("2"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n2);
			    	else if (encabezadoVO.getIdTipoTrans().equals("3"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n3);
			    	else if (encabezadoVO.getIdTipoTrans().equals("4"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n4);
			    	else if (encabezadoVO.getIdTipoTrans().equals("5"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n5);
			    	else if (encabezadoVO.getIdTipoTrans().equals("6"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n6);
			    	else if (encabezadoVO.getIdTipoTrans().equals("7"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n7);
			    	else if (encabezadoVO.getIdTipoTrans().equals("8"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n8);
			    	else if (encabezadoVO.getIdTipoTrans().equals("9"))
		    			idDoc.setIndTraslado(DocumentoDTE.SiiDte.IdDoc_IndTraslado.n9);
			    	//
			    	//idDoc.setIndTraslado((Integer.parseInt()));
			    }
			    idDoc.setTipoDespacho(DocumentoDTE.SiiDte.IdDoc_TipoDespacho.n1);
			     doc.getEncabezado().setIdDoc(idDoc);
			} catch (NumberFormatException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("Error 1:"+e.getMessage());
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("Error 2:"+e.getMessage());
			}
	        
	        //Documento/Encabezado/Emisor
	        //System.out.println("DTE Enc");
	        DocumentoDTE.SiiDte.Emisor emisor = new DocumentoDTE.SiiDte.Emisor();
	        try {
				emisor.setRUTEmisor(emisorVO.getRutEmisor());
				emisor.setRznSoc(emisorVO.getRazonsocialEmisor());
			    emisor.setGiroEmis(emisorVO.getGiroEmisor());
			    emisor.getActeco().add(BigInteger.valueOf(Integer.parseInt(emisorVO.getActeco())));
			    emisor.getTelefono().add(emisorVO.getTelefonoEmisor());
			    emisor.setDirOrigen(emisorVO.getDireccionEmisor());
			    emisor.setCmnaOrigen(emisorVO.getComunaEmisor());
			    emisor.setCiudadOrigen(emisorVO.getCiudadEmuisor());
			    doc.getEncabezado().setEmisor(emisor);
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("Error 3:"+e.getMessage());
			}
	      
	        //System.out.println("9:");
	        
	        //Documento/Encabezado/Receptor
	        //System.out.println("DTE Rec");
	        DocumentoDTE.SiiDte.Receptor receptor = new DocumentoDTE.SiiDte.Receptor();
	        try {
				receptor.setRUTRecep(receptorVO.getRutReceptor());
				receptor.setRznSocRecep(receptorVO.getRazonSocialReceptor());
		        receptor.setGiroRecep(receptorVO.getGiroReceptor());
		        receptor.setContacto(receptorVO.getContactoReceptor());
		        receptor.setCorreoRecep(receptorVO.getCorreoReceptor());
		        receptor.setDirRecep(receptorVO.getDireccionReceptor());
		        receptor.setCmnaRecep(receptorVO.getComunaReceptor());
		        receptor.setCiudadRecep(receptorVO.getCiudadReceptor());
		        receptor.setCmnaPostal(receptorVO.getComunaReceptor());
		        doc.getEncabezado().setReceptor(receptor);
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("Error 4:"+e.getMessage());
			}
	        
	        
	       if (encabezadoVO.getTipoDoc().equals("GDC")){ 	          
		        //Documento/Encabezado/Transporte
		        // Es opcional, en caso que el despacho vaya a otra direcci�n distinta al receptor
		        DocumentoDTE.SiiDte.Transporte transporte = new DocumentoDTE.SiiDte.Transporte();
		        //System.out.println("DTE Tra");
		        try {
					transporte.setDirDest(tranporteVO.getDireccionDestino());
					transporte.setCmnaDest(tranporteVO.getComunaDestino());
			        transporte.setCiudadDest(tranporteVO.getCuidadDestino());
			        doc.getEncabezado().setTransporte(transporte);
				} catch (LtException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println(horaActual+" Error 5:"+e.getMessage());
				}	        
	       }
	     //Documento/DscRcgGlobal
	       if (Integer.parseInt(totalesVO.getDescuento())>0){
		    	   
		       
		       DocumentoDTE.SiiDte.DscRcgGlobal dscRcgGlobal = new DocumentoDTE.SiiDte.DscRcgGlobal();
		       dscRcgGlobal.setNroLinDR(BigInteger.valueOf(1));
		       dscRcgGlobal.setTpoMov(DocumentoDTE.SiiDte.DscRcgGlobal_TpoMov.D);
		       dscRcgGlobal.setTpoValor(DocumentoDTE.SiiDte.DineroPorcentajeType.Dollar);
		     //dscRcgGlobal.setValorDR(BigInteger.valueOf(12345));
		       dscRcgGlobal.setValorDR(BigDecimal.valueOf(Integer.parseInt(totalesVO.getDescuento())));
		       dscRcgGlobal.setGlosaDR("Descuento Global");
		       doc.getDscRcgGlobal().add(dscRcgGlobal);
	       }
	       
	       
	       //doc.getDscRcgGlobal().add(dscRcgGlobal);

	        
	        //Documento/Encabezado/Totales
	       
	     //Documento/DscRcgGlobal
	       /*
	       DocumentoDTE.SiiDte.DscRcgGlobal dscRcgGlobal = new DocumentoDTE.SiiDte.DscRcgGlobal();
	       dscRcgGlobal.setNroLinDR(BigInteger.valueOf(1));
	       dscRcgGlobal.setTpoMov(DocumentoDTE.SiiDte.DscRcgGlobal_TpoMov.R);
	       dscRcgGlobal.setTpoValor(DocumentoDTE.SiiDte.DineroPorcentajeType.Percent);
	       dscRcgGlobal.setValorDR(BigDecimal.valueOf(12345));
	       doc.getDscRcgGlobal().add(dscRcgGlobal);
	       */
	        DocumentoDTE.SiiDte.Totales totales = new DocumentoDTE.SiiDte.Totales();
	        //System.out.println("DTE tot");
	        try {
	        	
				
				if (encabezadoVO.getTipoDoc().equals("FCE")||(encabezadoVO.getTipoDoc().equals("NCC")&&totalesVO.getTasaIva().equals("0"))||(encabezadoVO.getTipoDoc().equals("NDC")&&totalesVO.getTasaIva().equals("0"))){ 
					totales.setMntExe(BigInteger.valueOf(Integer.parseInt(totalesVO.getMontoNeto())));
				}else{
					totales.setMntNeto(BigInteger.valueOf(Integer.parseInt(totalesVO.getMontoNeto())));
					totales.setTasaIVA(BigDecimal.valueOf(Integer.parseInt(totalesVO.getTasaIva())));
					totales.setIVA(BigInteger.valueOf(Integer.parseInt(totalesVO.getIva())));

				}
			    totales.setMntTotal(BigInteger.valueOf(Integer.parseInt(totalesVO.getMontoTotal())));
			    doc.getEncabezado().setTotales(totales);
			} catch (NumberFormatException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println(horaActual+" Error 6:"+e.getMessage());
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println(horaActual+" Error 7:"+e.getMessage());
			}
	       
	    	//Documento/Detalle
	        //List detalleList
	        
	       if (detalleList.size() > 0){
	    	   DocumentoDTE.SiiDte.Detalle det = new DocumentoDTE.SiiDte.Detalle();
	    	   DocumentoDTE.SiiDte.CdgItem cdgItem = new DocumentoDTE.SiiDte.CdgItem();
				for (int i = 0; i < detalleList.size(); i++){
					
					DetalleVO  detalleVO = (DetalleVO) detalleList.get(i);
					//System.out.println("DTE detalle :"+i+" "+detalleVO.getItem());
					det = new DocumentoDTE.SiiDte.Detalle();
			        det.setNroLinDet(BigInteger.valueOf(i+1));
			        det.setNmbItem(detalleVO.getItem());
			        //System.out.println("getItem:"+detalleVO.getItem());
			        det.setDscItem(detalleVO.getDscItem());
			        //System.out.println("getDscItem:"+detalleVO.getDscItem());
			        //System.out.println("dcto :"+detalleVO.getDescuentoMonto());
			        if (!detalleVO.getDescuentoMonto().equals("0")){
			        // 	det.setDescuentoMonto(BigInteger.valueOf(0));
			        //}else{
			        	det.setDescuentoMonto(BigInteger.valueOf(Integer.parseInt(detalleVO.getDescuentoMonto())));
			        }
			        //System.out.println("getDescuentoMonto:"+detalleVO.getDescuentoMonto());
				    det.setMontoItem(BigInteger.valueOf(Integer.parseInt(detalleVO.getMontoItem())));
				    //System.out.println("getMontoItem:"+detalleVO.getMontoItem());
				    det.setQtyItem(BigDecimal.valueOf(Integer.parseInt(detalleVO.getQtyItem())));
				    //det.set
				    //System.out.println("getQtyItem:"+detalleVO.getQtyItem());
				    //det.setPrcItem(BigDecimal.valueOf(Integer.parseInt(detalleVO.getPrecioItem())));
				    if (!detalleVO.getPrecioItem().equals("0")){
					    BigDecimal bd2 = new BigDecimal(detalleVO.getPrecioItem());
					    //System.out.println("getPrecioItem:"+detalleVO.getPrecioItem());
					    det.setPrcItem(bd2);
				    	
				    }
				    if ((encabezadoVO.getTipoDoc().equals("NCC")&&totalesVO.getTasaIva().equals("0")) || (encabezadoVO.getTipoDoc().equals("NDC")&&totalesVO.getTasaIva().equals("0"))){
				    	//det.setIndExe(1);
				    	det.setIndExe(DocumentoDTE.SiiDte.Detalle_IndExe.n1);
				    	//System.out.println("Envio valor en NCR cuando es Fact Exenta");
				    }

				    //
				    
				     
				    
				    //Documento/Detalle/CdgItem		
			        cdgItem = new DocumentoDTE.SiiDte.CdgItem();
			        cdgItem.setTpoCodigo(detalleVO.getTipoCodigo());
			        //System.out.println("getTipoCodigo:"+detalleVO.getTipoCodigo());
			        cdgItem.setVlrCodigo(detalleVO.getValorCodigo());
			        //System.out.println("getValorCodigo:"+detalleVO.getValorCodigo());
			        det.getCdgItem().add(cdgItem);
			        doc.getDetalle().add(det);  				
				}
			}else{
				System.out.println("error no hay detalles");
			} 	
	       
	      
	       //detalle de Referencias de Guias para Conciliar con SII
	       /*if (encabezadoVO.getTipoDoc().equals("FCI")){
	        //Rerencias en la factura
	    	//Documento/Referencia
		        DocumentoDTE.SiiDte.Referencia reference = new DocumentoDTE.SiiDte.Referencia();
		        reference.setNroLinRef(BigInteger.valueOf(1));
		       	reference.setTpoDocRef("123"); //1-3 char
		       	reference.setFolioRef("20");
		       	reference.setFchRef(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, "2010-01-01"));
		       	doc.getReferencia().add(reference);
	        }*/
	       //System.out.println("Seteo Referencia");
	       if (detalleRefList.size() > 0){
	    	   if (encabezadoVO.getTipoDoc().equals("FCI") || encabezadoVO.getTipoDoc().equals("NCC") || encabezadoVO.getTipoDoc().equals("NDC")){
	    		   
		    	   //System.out.println("12:2 Ref");
		    	   //Rerencias en la factura
			       //Documento/Referencia
		    	   DocumentoDTE.SiiDte.Referencia reference = new DocumentoDTE.SiiDte.Referencia();
					for (int i = 0; i < detalleRefList.size(); i++){					
						DocumentoReferenciaVO  documentoRefVO = (DocumentoReferenciaVO) detalleRefList.get(i);	
						reference = new DocumentoDTE.SiiDte.Referencia();
						reference.setNroLinRef(BigInteger.valueOf(i+1));
				    	reference.setTpoDocRef(documentoRefVO.getTipoDocRef());
				    	reference.setFolioRef(documentoRefVO.getFolioRef());
				     	reference.setFchRef(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, documentoRefVO.getFechaRef()));
				     	if (documentoRefVO.getCodRef().equals("1"))
				     		reference.setCodRef(DocumentoDTE.SiiDte.Referencia_CodRef.n1);
				     	if (documentoRefVO.getCodRef().equals("2"))
				     		reference.setCodRef(DocumentoDTE.SiiDte.Referencia_CodRef.n2);
				     	if (documentoRefVO.getCodRef().equals("3"))
				     		reference.setCodRef(DocumentoDTE.SiiDte.Referencia_CodRef.n3);
				     	//System.out.println("Cod"+reference.getCodRef());
				    	doc.getReferencia().add(reference);			      		
					}
	    	   }
			}
	      
	        
	        //Personalizados
	       //System.out.println("DTE personalizados:");
	        DocumentoDTE.SiiDte.PersonalizadosA personalizados = new DocumentoDTE.SiiDte.PersonalizadosA();
	        try {
				dte.setPersonalizados(personalizados);
				personalizados.setDocPersonalizado(new DocumentoDTE.SiiDte.DocPersonalizadoA());
			    DocumentoDTE.SiiDte.CampoStringA campoString = new DocumentoDTE.SiiDte.CampoStringA();
			    if (observacionVO.getTexto()!=null){
			    	//System.out.println("- Obs"+observacionVO.getTexto());
				    campoString.setName(observacionVO.getNombre());
				    campoString.setText(observacionVO.getTexto());
			    }
			    if (observacionVO.getCondCompra()!=null){
			    	System.out.println("- Cond. Compra");
				    campoString.setName("condCompra");
				    campoString.setText(observacionVO.getCondCompra());
			    }
			    if (observacionVO.getNroOC()!=null){
			    	System.out.println("- Numero Orden de compra");
				    campoString.setName("nroOC");
				    campoString.setText(observacionVO.getNroOC());
			    }
			    personalizados.getDocPersonalizado().getCampoString().add(campoString);
			} catch (LtException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				System.out.println("Error 8:"+e.getMessage());
			}
	        
	       
	        		
	        // Llamada al servicio
	        //System.out.println("DTE conf. Server");
	   	 /* 
		 	System.out.println("dteAmbiente"+dteAmbiente);
		 	System.out.println("dteFechaRes"+dteFechaRes);
		 	int numeroResolucion = Integer.parseInt(dteNumRes);
		 	System.out.println("dteNumRes"+dteNumRes+" numeroResolucion:"+numeroResolucion);
*/
	        String ambiente;
		 	if (dteAmbiente.equals("HOMOLOGACION"))
		 		ambiente = dteboxcliente.Ambiente.Homologacion;
		 	else if (dteAmbiente.equals("PRODUCCION"))
		 		ambiente = dteboxcliente.Ambiente.Produccion;
		 	else
		 		ambiente = "";
	        String fechaResolucion = dteFechaRes;
	        int numeroResolucion = Integer.parseInt(dteNumRes);
	        //int numeroResolucion = Integer.parseInt(dteNumRes);

	        
	        int tipoPdf417 = dteboxcliente.TipoPDF417.Fuente;
	        // Local la IP debe ser 10.10.10.10
	    	String apiURL = "http://10.10.10.10/api/Core.svc/Core";
	        //String apiURL = "http://25.120.85.185/api/Core.svc/Core";
	        // DTEBox liche
	        String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";
	        dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
	        //System.out.println("DTE envio");
	        dteboxcliente.ResultadoEnvioDocumento resultado = servicio.EnviarDocumento(dte, ambiente, fechaResolucion, numeroResolucion, tipoPdf417);
	        //System.out.println("DTE resultado");
	        if (resultado.getResultadoServicio().getEstado() == 0){            
	            //System.out.println("ok");
	            String ted    = resultado.getTED();
	            String pdf417 = resultado.getPDF417();             
	            String folio = "";
				try {
					folio = String.valueOf(idDoc.getFolio().intValue());
				} catch (LtException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println(horaActual+" Error 9:"+e.getMessage());
				}
	            //System.out.println("Folio Guia Enviado al SII por visar: " + idDoc.getFolio().intValue()); 
	            GuiaDespRptaDTE rptaDte = new GuiaDespRptaDTE();
	            rptaDte.setTed(ted);
	            rptaDte.setFolio(folio);
	            rptaDte.setPdf(pdf417);
	            listRetorno.add(rptaDte);
	            control = 3;
	            
	        }else{
	            String error = resultado.getResultadoServicio().getDescripcion();
	            System.out.println(horaActual+" control dteBox Liga:"+error);
	            System.out.println("estado:"+resultado.getResultadoServicio().getEstado());
	            System.out.println(resultado.getResultadoServicio().getExcepcionOriginal());
	            int estado = resultado.getResultadoServicio().getEstado();
	            if (estado == 1){
	               control = 5;
	            }else{
	               control = 4;
	            }
	           
	            
	         
	        }
        }else{
        	System.out.println(horaActual+" Documento no codificado:"+encabezadoVO.getTipoDoc()+"; Num_Folio"+encabezadoVO.getFolio());
        }
	  return control;	
	
	}
	
	public int enviaBoleta(EncabezadoVO encabezadoVO,ReceptorVO receptorVO,	TransporteVO tranporteVO,
            TotalesVO totalesVO, ObservacionVO observacionVO, EmisorVO emisorVO, 
            List<DetalleVO> detalleList,  List <DocumentoReferenciaVO> detalleRefList) throws LtException{
		List<GuiaDespRptaDTE> listRetorno = new ArrayList<GuiaDespRptaDTE>();
		int control = 4;
		DocumentoBoleta.SiiDte.BOLETADefType boleta = new DocumentoBoleta.SiiDte.BOLETADefType();
        
		DocumentoBoleta.SiiDte.Documento doc = new DocumentoBoleta.SiiDte.Documento();
		
		boleta.setDocumento(doc);
        
		//Documento/Encabezado
		doc.setEncabezado(new DocumentoBoleta.SiiDte.Encabezado());
		        
		//Documento/Encabezado/IdDoc
		DocumentoBoleta.SiiDte.IdDoc idDoc = new DocumentoBoleta.SiiDte.IdDoc();
		doc.getEncabezado().setIdDoc(idDoc);
		idDoc.setTipoDTE(DocumentoBoleta.SiiDte.DTEType.n39);
		idDoc.setFolio(BigInteger.valueOf(Integer.parseInt(encabezadoVO.getFolio())));
	    idDoc.setFchEmis(new com.liquid_technologies.ltxmllib8.DateTime(com.liquid_technologies.ltxmllib8.DateTimeType.date, encabezadoVO.getFechaEmis()));
		idDoc.setIndServicio(DocumentoBoleta.SiiDte.IdDoc_IndServicio.n1);
		        
		//Documento/Encabezado/Emisor
		DocumentoBoleta.SiiDte.Emisor emisor = new DocumentoBoleta.SiiDte.Emisor();
		doc.getEncabezado().setEmisor(emisor);
		emisor.setRUTEmisor(emisorVO.getRutEmisor());
		        
		//Documento/Encabezado/Receptor
		DocumentoBoleta.SiiDte.Receptor receptor = new DocumentoBoleta.SiiDte.Receptor();
		doc.getEncabezado().setReceptor(receptor);
		receptor.setRUTRecep(receptorVO.getRutReceptor());
		receptor.setRznSocRecep(receptorVO.getRazonSocialReceptor());

	        
		//Boleta/Documento/Encabezado/Totales
		DocumentoBoleta.SiiDte.Totales totales = new DocumentoBoleta.SiiDte.Totales();
		doc.getEncabezado().setTotales(totales);
		totales.setMntTotal(BigInteger.valueOf(Integer.parseInt(totalesVO.getMontoTotal())));
		
		        
		//Boleta/Documento/Detalle
		/*
		DocumentoBoleta.SiiDte.Detalle det = new DocumentoBoleta.SiiDte.Detalle();
		doc.getDetalle().add(det);
		det.setNroLinDet(BigInteger.valueOf(1));
		det.setNmbItem("Nombre del detalle");
		det.setMontoItem(BigInteger.valueOf(5));
		*/
		        
		if (detalleList.size() > 0){
			DocumentoBoleta.SiiDte.Detalle det = new DocumentoBoleta.SiiDte.Detalle();
			for (int i = 0; i < detalleList.size(); i++){
				DetalleVO  detalleVO = (DetalleVO) detalleList.get(i);
				det = new DocumentoBoleta.SiiDte.Detalle();
				det.setNroLinDet(BigInteger.valueOf(i+1));
				det.setNmbItem(detalleVO.getItem());
				det.setDscItem(detalleVO.getDscItem());
				if (!detalleVO.getDescuentoMonto().equals("0")){
					det.setDescuentoMonto(BigInteger.valueOf(Integer.parseInt(detalleVO.getDescuentoMonto())));
				}
				det.setMontoItem(BigInteger.valueOf(Integer.parseInt(detalleVO.getMontoItem())));
				det.setQtyItem(BigDecimal.valueOf(Integer.parseInt(detalleVO.getQtyItem())));
				if (!detalleVO.getPrecioItem().equals("0")){
					BigDecimal bd2 = new BigDecimal(detalleVO.getPrecioItem());
					det.setPrcItem(bd2);
				}
				doc.getDetalle().add(det);
			}
			String ambiente;
			if (dteAmbiente.equals("HOMOLOGACION"))
				ambiente = dteboxcliente.Ambiente.Homologacion;
			else if (dteAmbiente.equals("PRODUCCION"))
				ambiente = dteboxcliente.Ambiente.Produccion;
			else
				ambiente = "";
			String fechaResolucion = dteFechaRes;
			int numeroResolucion = Integer.parseInt(dteNumRes);
			int tipoPdf417 = dteboxcliente.TipoPDF417.Fuente;
			String apiURL = "http://10.10.10.10/api/Core.svc/Core";
			String apiAuth = "6dd62425-c356-41bb-948c-526a85d92b16";
			dteboxcliente.Servicio servicio = new dteboxcliente.Servicio(apiURL, apiAuth);
			dteboxcliente.ResultadoEnvioDocumento resultado = servicio.EnviarDocumento(boleta, ambiente, fechaResolucion, numeroResolucion, tipoPdf417);
		
			//Procesar resultado
			if (resultado.getResultadoServicio().getEstado() == 0){            
		            //System.out.println("ok");
				String ted    = resultado.getTED();
				String pdf417 = resultado.getPDF417();             
				String folio = "";
				try {
					folio = String.valueOf(idDoc.getFolio().intValue());
				} catch (LtException e) {
						// TODO Auto-generated catch block
					e.printStackTrace();
					System.out.println(horaActual+" Error 9:"+e.getMessage());
				}
		            //System.out.println("Folio Guia Enviado al SII por visar: " + idDoc.getFolio().intValue()); 
				GuiaDespRptaDTE rptaDte = new GuiaDespRptaDTE();
				rptaDte.setTed(ted);
				rptaDte.setFolio(folio);
				rptaDte.setPdf(pdf417);
				listRetorno.add(rptaDte);
				control = 3;
		            
			}else{
				String error = resultado.getResultadoServicio().getDescripcion();
				System.out.println(horaActual+" control dteBox Liga:"+error);
				System.out.println("estado:"+resultado.getResultadoServicio().getEstado());
				System.out.println(resultado.getResultadoServicio().getExcepcionOriginal());
				int estado = resultado.getResultadoServicio().getEstado();
				if (estado == 1){
					control = 5;
				}else{
					control = 4;
				}
			}	      				
		}else{
			control = 6;
        	System.out.println(horaActual+" Documento sin detalle :"+encabezadoVO.getTipoDoc()+"; Num_Folio"+encabezadoVO.getFolio());
			
		} 	
		
		return control;
	}

}
